package main

import "fmt"

// 只有当结构体实例化时，才会真正地分配内存。也就是必须实例化后才能使用结构体的字段。
type person struct {
	name string // 同样类型的字段也可以写在一行
	city string
	age  int8
}

func main() {
	// 基本实例化
	var p1 person
	p1.name = "pprof.cn"
	p1.city = "北京"
	p1.age = 18
	fmt.Printf("p1=%v\n", p1)  //p1={pprof.cn 北京 18}
	fmt.Printf("p1=%#v\n", p1) //p1=main.person{name:"pprof.cn", city:"北京", age:18}
	fmt.Println(p1.name)
	fmt.Println(p1.age)
	// 键值对实例化
	p2 := person{
		name: "王晋",
		city: "泸州",
		age:  19,
	}
	fmt.Println("p2:", p2)
	// 1.指针类型实例化
	var p3 = new(person)
	p3.name = "郭靖"
	p3.city = "广元"
	p3.age = 19
	fmt.Println(p3)
	// 2.指针类型实例化
	/*
		1.必须初始化结构体的所有字段。
		2.初始值的填充顺序必须与字段在结构体中的声明顺序一致。
		3.该方式不能和键值初始化方式混用。
	*/
	p8 := &person{
		"pprof.cn",
		"北京",
		18,
	}
	fmt.Println(p8)
	// 匿名结构体
	var user struct {
		name   string
		age    int
		school string
	}
	// 匿名结构体赋值
	user.name = "Tom"
	user.age = 19
	user.school = "四川化工职业技术学院"
}
